from django import template

register = template.Library()

@register.filter
def divisibleby(value, arg):
    """检查值是否能被参数整除"""
    try:
        return float(value) % float(arg) == 0
    except (ValueError, ZeroDivisionError):
        return False

@register.filter(name='multiply')
def multiply(value, arg):
    """实现两个数值的乘法运算（支持整数/浮点数）"""
    try:
        return float(value) * float(arg)
    except (ValueError, TypeError):
        return 0

@register.filter(name='add_class')
def add_class(field, css):
    """
    给表单字段的 widget 添加 CSS 类。
    这个实现方式更健壮，它直接操作 widget 的 attrs，而不是尝试再次渲染。
    """
    if hasattr(field, 'as_widget'):
        # 如果传入的是原始字段对象，直接操作其 widget
        field.field.widget.attrs['class'] = css
        return field
    # 如果传入的是已经渲染的字符串，则直接返回，避免报错
    return field

@register.filter(name='attr')
def add_attribute(field, attr):
    """
    给表单字段的 widget 添加任意属性，格式为 'name:value'。
    """
    if hasattr(field, 'as_widget'):
        try:
            name, value = attr.split(':')
            field.field.widget.attrs[name] = value
        except ValueError:
            # 如果格式不正确，不做任何操作
            pass
        return field
    # 如果传入的是已经渲染的字符串，则直接返回，避免报错
    return field


@register.filter
def get_item(dictionary, key):
    """从字典中获取指定键的值"""
    return dictionary.get(key, '')

@register.filter
def get_loss_type_name(loss_type, loss_type_names):
    """获取失分类型名称"""
    return loss_type_names.get(loss_type, '未知类型')

@register.filter
def get_loss_type_color(loss_type, loss_type_colors):
    """获取失分类型颜色"""
    return loss_type_colors.get(loss_type, '#b2bec3')